package com.ncmmall.domain.security.user;


import com.fasterxml.jackson.annotation.JsonIgnore;
import com.ncmmall.domain.business.distribution.Distributor;
import com.ncmmall.domain.business.live.LiveSession;
import com.ncmmall.domain.business.merchant.MerchantEnterpriseInfo;
import com.ncmmall.domain.business.merchant.MerchantIndividualInfo;
import com.ncmmall.domain.business.merchant.MerchantPersonalInfo;
import com.ncmmall.domain.business.news.News;
import com.ncmmall.domain.security.role.Role;
import com.google.common.base.Strings;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import javax.persistence.*;
import java.sql.Timestamp;
import java.util.List;

/**
 * @author linxs
 * 会员、商家、系统管理员等用户
 */
@Entity
@Table(name = "security_web_user")
@Access(AccessType.FIELD)
@Getter
@Setter
@Accessors(chain = true)
public class WebUser {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    /**
     * 账号
     */
    private String username;

    /**
     * 密码
     */
    private String password;

    /**
     * 所属角色
     */
    @OneToOne
    @JsonIgnore
    private Role role;

    /**
     * 1、男士
     * 2、女士
     */
    private int sex;

    /**
     * 会员编号
     */
    private String userNo;

    /**
     * 是否未禁止登录
     */
    private boolean accountNonLocked = true;

    /**
     * 接口访问token
     */
    private String accessToken;

    /**
     * 刷新访问token
     */
    private String refreshToken;

    /**
     * 注册时间
     */
    private Timestamp createTime;

    /**
     * 最后登录时间
     */
    private Timestamp lastLoginTime;

    /**
     * 第一次登录时间
     */
    private Timestamp firstLoginTime;

    /**
     * 登录IP地址
     */
    private String loginIp;

    /**
     * 昵称
     */
    private String nickname;

    /**
     * 名称
     */
    private String realName;

    /**
     * 手机号
     */
    private String mobile;

    /**
     * 头像
     */
    private String avatar;

    /**
     * 邮箱
     */
    private String email;

    /**
     * 个性签名
     */
    private String signature;

    /**
     * 系统消息数量
     */
    private int systemMessageNumber;

    /**
     * 订单消息数量
     */
    private int orderMessageNumber;

    /**
     * 提现消息数量
     */
    private int withDrawMessageNumber;

    /**
     * openId
     */
    private String openId;

    /**
     * 微信sessionKey
     */
    private String wechatSessionKey;

    /**
     * 微信unionId
     */
    @Column(unique = true)
    private String unionId;

    /**
     * 是否第一次登入商家、供应商并修改密码
     */
    private boolean firstLogin;

    /**
     * 邀请人
     */
    @OneToOne
    @JsonIgnore
    private WebUser father;

    /**
     * 邀请人过期时间
     */
    private Timestamp fatherExpires;

    /**
     * 是否为分销商
     */
    @OneToOne
    @JsonIgnore
    private Distributor distributor;

    /**
     * 保底佣金
     */
    private Double guaranteeScale;

    /* ============================直播间信息===================================== */

    /**
     * 1、主播
     * 2、助理
     */
    private int liveType;

    /**
     * 直播间ID
     */
    private String liveID;

    /**
     * 直播间名称
     */
    private String liveName;

    /**
     * 直播间介绍
     */
    private String liveIntroduce;

    /**
     * 直播间图片
     */
    private String liveImage;

    /**
     * 身份证号码
     */
    private String LiveIdCardNo;

    /**
     * 身份证照片（正面）
     */
    private String LiveIdCardFront;

    /**
     * 身份证照片（正面）
     */
    private String LiveIdCardReverse;

    /**
     * 姓名修改时间(最新)
     */
    private Timestamp modifyRealNameTime;

    /**
     * 修改昵称的时间, 15天只能修改一次
     */
    private Timestamp modifyNicknameTime;

    /**
     * 助理帐号所属主播
     */
    @OneToOne
    @JsonIgnore
    private WebUser anchor;

    @Transient
    private Long anchorId;

    /**
     * 开通直播间的时间
     */
    private Timestamp liveCreateTime;

    /**
     * 当前直播状态，给前端展示使用
     */
    private boolean liveStatus;

    /**
     * 直播余额
     */
    @JsonIgnore
    private double liveBalance;

    /**
     * 主播当前直播场次(null表示未开播)
     */
    @OneToOne
    @JsonIgnore
    @JoinColumn(name = "live_session_id")
    private LiveSession liveSession;

    /* ============================商家信息===================================== */

    /**
     * 商家余额
     */
    private double balance;

    /**
     * 店铺名称
     */
    private String shopName;

    /**
     * 店铺背景图
     */
    private String shopBanner;

    /**
     * QQ
     */
    private String qq;

    /**
     * 微信
     */
    private String wechat;

    /**
     * 主体类型
     * 1、企业
     * 2、个体户
     * 3、个人
     */
    private int mainType;

    /**
     * 品牌资质图片
     */
    private String certificate;

    /**
     * 商家企业信息（只在mainType=1时有意义）
     */
    @OneToOne
    private MerchantEnterpriseInfo merchantEnterpriseInfo;

    /**
     * 商家个体户信息（只在mainType=2时有意义）
     */
    @OneToOne
    private MerchantIndividualInfo merchantIndividualInfo;

    /**
     * 商家个人信息（只在mainType=3时有意义）
     */
    @OneToOne
    private MerchantPersonalInfo merchantPersonalInfo;

    /**
     * 商家审核状态
     * 1、待审核
     * 2、审核通过
     * 3、审核不通过
     */
    private int merchantCheckStatus;

    /**
     * 商家入驻时间（审核通过时间）
     */
    private Timestamp merchantEnterTime;

    /**
     * 在售商品数量
     */
    private int goodsNumber;

    /**
     * 总成交订单金额
     */
    private double totalOrderAmount;

    /**
     * 总成交订单笔数
     */
    private int totalOrderNumber;

    /**
     * 商家审核备注
     */
    @Lob
    private String merchantCheckNote;

    /**
     * 自提地址
     */
    private String warehouseAddress;

    /**
     * 银行卡开户人
     */
    private String bankAccountHolder;

    /**
     * 银行预留手机号码
     */
    private String bankMobile;

    /**
     * 银行名称
     */
    private String bankName;

    /**
     * 银行卡号
     */
    private String bankCardNo;

    /**
     * 银行省
     */
    private String bankProvince;

    /**
     * 银行市
     */
    private String bankCity;

    /**
     * 银行支行名称
     */
    private String bankSubBranchName;

    /**
     * 商家发票抬头类型
     * 1、企业
     * 2、个人
     */
    private int merchantInvoiceTitleType;

    /**
     * 商家发票抬头
     */
    private String merchantInvoiceTitle;

    /**
     * 商家发票税号
     */
    private String merchantInvoiceTFN;

    /**
     * 是否为自营商家
     * 1、是
     */
    private int selfSupport;

    /**
     * 供应商账号关联的商家
     */
    @OneToOne
    private WebUser relevanceMerchant;

    /**
     * 商家关联的会员
     */
    @OneToOne
    private WebUser relevanceMember;

    /* ===================================================================== */

    /**
     * 按商家入驻时间排序
     */
    @Transient
    private String orderByMerchantEnterTime;

    /**
     * 按在售商品数量排序
     */
    @Transient
    private String orderByGoodsNumber;

    /**
     * 按总成交订单金额排序
     */
    @Transient
    private String orderByTotalOrderAmount;

    /**
     * 按总成交订单笔数排序
     */
    @Transient
    private String orderByTotalOrderNumber;

    /**
     * 按注册时间排序
     */
    @Transient
    private String orderByCreateTime;

    @Transient
    private String merchantGoodsChannelsData;

    @Transient
    private int messageCount;

    /**
     * 未付款订单数
     */
    @Transient
    private int nonPaymentOrders;

    /**
     * 未发货订单数
     */
    @Transient
    private int unfilledOrders;

    /**
     * 未收货订单数
     */
    @Transient
    private int nonReceiveOrders;

    /**
     * 未评价订单数
     */
    @Transient
    private int nonCommentOrders;

    /**
     * 售后订单数
     */
    @Transient
    private int afterSaleOrders;

    /**
     * 收藏数
     */
    @Transient
    private int collectCount;

    /**
     * 公告
     */
    @Transient
    private List<News> newses;

    @Transient
    private String avatarName;

    @Transient
    private String certificateName;

    /**
     * 是否为分销商
     */
    @Transient
    private boolean distributorFlag;

    /**
     * 分销商状态
     * 1 启用
     * 2 禁用
     */
    @Transient
    private Integer distributiorStatus;

    /**
     * 是否为主播
     */
    @Transient
    private boolean anchorFlag;

    @Transient
    private int subordinateNum;

    @Transient
    private String data;

    /**
     * 用户锁定筛选
     * 0、全部
     * 1、正常
     * 2、禁用
     */
    @JsonIgnore
    @Transient
    private int accountLocked;

    /**
     * 关注直播粉丝数量
     */
    @Transient
    private long fansNumber;

    @Transient
    private String mobileCode;

    public boolean isEnterpriseMerchant() {
        return mainType == 1;
    }

    public boolean isIndividualMerchant() {
        return mainType == 2;
    }

    public boolean isPersonalMerchant() {
        return mainType == 3;
    }

    public String getRealAvatar(String storeDomain) {
        if (Strings.isNullOrEmpty(this.avatar)) {
            return this.avatar;
        }
        return storeDomain + "/uploads/" + this.avatar;
    }

}
